import { Request, Response, NextFunction } from 'express';
import ApiResponse from '@/utils/api/api-response.util';
import { isEmpty, isValidStatus } from '../common/validation.util';
import postService from '@/services/system/post.service';
import { getLogger } from '@/utils/logger';
import { AuthRequest } from '@/types';

const logger = getLogger('post-validator', { console: false });
const consoleLogger = getLogger('post-validator');

/**
 * 验证岗位创建参数
 */
export const validatePostCreate = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { postName, postCode, postSort, status } = req.body;
    
    // 岗位名称验证
    if (isEmpty(postName)) {
      return ApiResponse.error(res, '岗位名称不能为空', 400);
    }
    
    // 岗位编码验证
    if (isEmpty(postCode)) {
      return ApiResponse.error(res, '岗位编码不能为空', 400);
    }
    
    // 岗位排序验证
    if (isEmpty(postSort) || isNaN(parseInt(postSort))) {
      return ApiResponse.error(res, '岗位排序必须为数字', 400);
    }
    
    // 状态验证
    if (!isEmpty(status) && !isValidStatus(status)) {
      return ApiResponse.error(res, '状态值无效', 400);
    }
    
    // 校验岗位名称是否唯一
    if (!(await postService.checkPostNameUnique({ postName }))) {
      consoleLogger.warn('新增岗位失败: 岗位名称已存在', { postName });
      return ApiResponse.error(res, '新增岗位失败，岗位名称已存在', 400);
    }
    
    // 校验岗位编码是否唯一
    if (!(await postService.checkPostCodeUnique({ postCode }))) {
      consoleLogger.warn('新增岗位失败: 岗位编码已存在', { postCode });
      return ApiResponse.error(res, '新增岗位失败，岗位编码已存在', 400);
    }
    
    logger.debug('岗位创建参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`岗位创建验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证岗位更新参数
 */
export const validatePostUpdate = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { postId, postName, postCode, postSort, status } = req.body;
    
    if (isEmpty(postId) || isNaN(parseInt(postId))) {
      return ApiResponse.error(res, '岗位ID不能为空', 400);
    }
    
    if (isEmpty(postName)) {
      return ApiResponse.error(res, '岗位名称不能为空', 400);
    }
    
    if (isEmpty(postCode)) {
      return ApiResponse.error(res, '岗位编码不能为空', 400);
    }
    
    if (isEmpty(postSort) || isNaN(parseInt(postSort))) {
      return ApiResponse.error(res, '岗位排序必须为数字', 400);
    }
    
    if (!isEmpty(status) && !isValidStatus(status)) {
      return ApiResponse.error(res, '状态值无效', 400);
    }
    
    const pId = parseInt(postId);
    
    // 校验岗位是否存在
    const post = await postService.selectPostById(pId);
    if (!post) {
      logger.warn('修改岗位失败: 岗位不存在', { postId: pId });
      return ApiResponse.error(res, '修改岗位失败，岗位不存在', 400);
    }
    
    // 校验岗位名称是否唯一
    if (!(await postService.checkPostNameUnique({ postName, postId: pId }))) {
      logger.warn('修改岗位失败: 岗位名称已存在', { postName });
      return ApiResponse.error(res, '修改岗位失败，岗位名称已存在', 400);
    }
    
    // 校验岗位编码是否唯一
    if (!(await postService.checkPostCodeUnique({ postCode, postId: pId }))) {
      logger.warn('修改岗位失败: 岗位编码已存在', { postCode });
      return ApiResponse.error(res, '修改岗位失败，岗位编码已存在', 400);
    }
    
    logger.debug('岗位更新参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`岗位更新验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证岗位删除参数
 */
export const validatePostRemove = async (req: AuthRequest, res: Response, next: NextFunction) => {
  try {
    const postIds = req.params.postIds.split(',').map(id => parseInt(id));
    
    if (!postIds.length || postIds.some(id => isNaN(id) || id <= 0)) {
      return ApiResponse.error(res, '岗位ID无效', 400);
    }
    
    // 校验岗位是否存在关联用户
    for (const postId of postIds) {
      const userCount = await postService.countUserPostById(postId);
      if (userCount > 0) {
        logger.warn('删除岗位失败: 岗位已分配用户，不能删除', { postId, userCount });
        return ApiResponse.error(res, `岗位已分配用户，不能删除`, 400);
      }
    }
    
    logger.debug('岗位删除参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`岗位删除验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
}; 